package br.com.foxinline.manager.pesquisar;

import br.com.foxinline.modelo.*;
import br.com.foxinline.servico.AverbacaoServico;
import br.com.foxinline.servico.CidadeServico;
import br.com.foxinline.servico.ImovelServico;
import br.com.foxinline.servico.ObjetoServico;
import br.com.foxinline.servico.RegistroServico;
import br.com.foxinline.servico.TransferenciaServico;
import br.com.foxinline.utilitario.Caracteres;
import java.io.IOException;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import org.primefaces.model.map.*;

/**
 *
 * @author cadomeireles
 */
@ViewScoped
@ManagedBean
public class ManagerPesquisarImovel implements Serializable {

    @EJB
    ImovelServico imovelServico;
    @EJB
    ObjetoServico objetoServico;
    @EJB
    TransferenciaServico transferenciaServico;
    @EJB
    AverbacaoServico averbacaoServico;
    @EJB
    RegistroServico registroServico;
    @EJB
    CidadeServico cidadeServico;
    private Imovel imovelVisualizar;
    private Imovel imovelDeletar;
    private Objeto objetoPesquisar;
    private Objeto objetoVisualizar;
    private Pessoa pessoaPesquisar;
    private Registro registroVisualizar;
    private Transferencia transferenciaVisualizar;
    private List<RegistroAnterior> registrosAnterioresNaoCadastrados;
    private List<Imovel> imoveisAnteriores;
    private List<Pessoa> adquirentes;
    private List<Pessoa> transmitentes;
    private List<Averbacao> averbacoes;
    private List<Registro> registros;
    private List<Georreferenciamento> coordenadas;
    private MapModel mapa;
    private String centroMapa;
    private List<Anexo> anexos;
    private List<Imovel> imoveis;
    private String registro;
    String tipoPesquisaImovel;
    String visualizarId;

    @PostConstruct
    public void init() {
        instanciar();
        delegar();
    }

    private void instanciar() {
        this.registro = new String();
        this.imovelDeletar = new Imovel();
        this.objetoPesquisar = new Objeto();
        this.objetoPesquisar.setEndereco(new Endereco());
        this.pessoaPesquisar = new Pessoa();
        this.imoveis = new ArrayList<Imovel>();
        this.tipoPesquisaImovel = "A";
    }

    private void delegar() {
        Map<String, String> parametros = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap();
        this.visualizarId = parametros.get("imovelId");

        if (this.visualizarId != null) {
            this.imovelVisualizar = imovelServico.pesquisar(Long.parseLong(this.visualizarId));
            this.objetoVisualizar = objetoServico.pesquisar(this.imovelVisualizar);

            this.registroVisualizar = imovelServico.obterPrimeiroRegistro(imovelVisualizar);
            this.transferenciaVisualizar = imovelServico.transferenciaAtual(this.imovelVisualizar);

            this.adquirentes = transferenciaServico.pesquisarAdquirentes(this.transferenciaVisualizar);
            this.transmitentes = transferenciaServico.pesquisarTransmitentes(this.transferenciaVisualizar);

            this.averbacoes = averbacaoServico.pesquisar(this.imovelVisualizar);

            this.registros = registroServico.pesquisar(this.imovelVisualizar);

            this.coordenadas = imovelServico.coordenadas(this.imovelVisualizar);

            this.imoveisAnteriores = imovelServico.pesquisarImoveisAnteriores(this.imovelVisualizar);

            this.registrosAnterioresNaoCadastrados = imovelServico.pesquisarRegistrosNaoCadastrados(this.imovelVisualizar);

            this.coordenadas = imovelServico.coordenadas(this.imovelVisualizar);

            if (!this.coordenadas.isEmpty()) {
                plotar();
            }

            this.anexos = imovelServico.pesquisarAnexos(this.imovelVisualizar);
        }
    }

    public void plotar() {
        LatLng coordenada;
        Polygon poligono = new Polygon();
        this.mapa = new DefaultMapModel();

        for (Georreferenciamento ponto : this.coordenadas) {
            coordenada = new LatLng(ponto.getLatitude(), ponto.getLongitude());
            this.mapa.addOverlay(new Marker(coordenada));
            poligono.getPaths().add(coordenada);
            poligono.setStrokeColor("#FF9900");
            poligono.setStrokeOpacity(0.7);
            poligono.setFillColor("#FF9900");
            poligono.setFillOpacity(0.2);
            this.mapa.addOverlay(poligono);
        }

        centroMapa = this.coordenadas.get(0).getLatitude() + ", " + this.coordenadas.get(0).getLongitude();
    }

    public void pesquisar() {
        this.imoveis = imovelServico.pesquisar(this.registro, this.objetoPesquisar, this.pessoaPesquisar, this.tipoPesquisaImovel);
    }

    public void limpar() {
        instanciar();
    }

    public void emitirMatricula() {
        imovelServico.emitirMatricula(this.imovelVisualizar);
    }

    public List<Pessoa> ultimoAdquirente(Imovel imovel) {
        return imovelServico.obterUltimoAdquirente(imovel);
    }

    public List<Pessoa> obterTrasmitentes(Transferencia transferencia) {
        return transferenciaServico.pesquisarTransmitentes(transferencia);       
    }

    public List<Pessoa> obterAdquirentes(Transferencia transferencia) {
        return transferenciaServico.pesquisarAdquirentes(transferencia);
    }
    
    public String adicionarMascaraCNPJ(String string) {
        return Caracteres.adicionarMascara(string, Caracteres.cnpjMask);
    }

    public String adicionarMascaraCPF(String string) {
        return Caracteres.adicionarMascara(string, Caracteres.cpfMask);
    }

    public String adicionarMascaraCEP(String string) {
        return Caracteres.adicionarMascara(string, Caracteres.cepMask);
    }

    public void deletar() {
        imovelServico.deletar(this.imovelDeletar);

        ExternalContext context = FacesContext.getCurrentInstance().getExternalContext();
        FacesContext fc = FacesContext.getCurrentInstance();
        FacesContext.getCurrentInstance().addMessage("messages", new FacesMessage(FacesMessage.SEVERITY_INFO, "Imóvel excluído com sucesso!", ""));
        fc.getExternalContext().getFlash().setKeepMessages(true);

        try {
            context.redirect("pesquisarImovel.xhtml");
        } catch (IOException ex) {
            Logger.getLogger(ManagerPesquisarPessoa.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public List<Cidade> autocompletarCidade(String query) {
        return cidadeServico.autocompletar(query);
    }

    public List<Imovel> getImoveis() {
        return imoveis;
    }

    public void setImoveis(List<Imovel> imoveis) {
        this.imoveis = imoveis;
    }

    public Objeto getObjetoPesquisar() {
        return objetoPesquisar;
    }

    public void setObjetoPesquisar(Objeto objetoPesquisar) {
        this.objetoPesquisar = objetoPesquisar;
    }

    public Imovel getImovelVisualizar() {
        return imovelVisualizar;
    }

    public void setImovelVisualizar(Imovel imovelVisualizar) {
        this.imovelVisualizar = imovelVisualizar;
    }

    public Objeto getObjetoVisualizar() {
        return objetoVisualizar;
    }

    public void setObjetoVisualizar(Objeto objetoVisualizar) {
        this.objetoVisualizar = objetoVisualizar;
    }

    public Transferencia getTransferenciaVisualizar() {
        return transferenciaVisualizar;
    }

    public void setTransferenciaVisualizar(Transferencia transferenciaVisualizar) {
        this.transferenciaVisualizar = transferenciaVisualizar;
    }

    public List<Pessoa> getAdquirentes() {
        return adquirentes;
    }

    public void setAdquirentes(List<Pessoa> adquirentes) {
        this.adquirentes = adquirentes;
    }

    public List<Pessoa> getTransmitentes() {
        return transmitentes;
    }

    public void setTransmitentes(List<Pessoa> transmitentes) {
        this.transmitentes = transmitentes;
    }

    public Imovel getImovelDeletar() {
        return imovelDeletar;
    }

    public void setImovelDeletar(Imovel imovelDeletar) {
        this.imovelDeletar = imovelDeletar;
    }

    public Pessoa getPessoaPesquisar() {
        return pessoaPesquisar;
    }

    public void setPessoaPesquisar(Pessoa pessoaPesquisar) {
        this.pessoaPesquisar = pessoaPesquisar;
    }

    public String getTipoPesquisaImovel() {
        return tipoPesquisaImovel;
    }

    public void setTipoPesquisaImovel(String tipoPesquisaImovel) {
        this.tipoPesquisaImovel = tipoPesquisaImovel;
    }

    public List<Imovel> getImoveisAnteriores() {
        return imoveisAnteriores;
    }

    public void setImoveisAnteriores(List<Imovel> imoveisAnteriores) {
        this.imoveisAnteriores = imoveisAnteriores;
    }

    public List<Anexo> getAnexos() {
        return anexos;
    }

    public void setAnexos(List<Anexo> anexos) {
        this.anexos = anexos;
    }

    public List<Averbacao> getAverbacoes() {
        return averbacoes;
    }

    public void setAverbacoes(List<Averbacao> averbacoes) {
        this.averbacoes = averbacoes;
    }

    public List<Registro> getRegistros() {
        return registros;
    }

    public void setRegistros(List<Registro> registros) {
        this.registros = registros;
    }

    public String getRegistro() {
        return registro;
    }

    public void setRegistro(String registro) {
        this.registro = registro;
    }

    public List<Georreferenciamento> getCoordenadas() {
        return coordenadas;
    }

    public void setCoordenadas(List<Georreferenciamento> coordenadas) {
        this.coordenadas = coordenadas;
    }

    public String getCentroMapa() {
        return centroMapa;
    }

    public void setCentroMapa(String centroMapa) {
        this.centroMapa = centroMapa;
    }

    public MapModel getMapa() {
        return mapa;
    }

    public void setMapa(MapModel mapa) {
        this.mapa = mapa;
    }

    public List<RegistroAnterior> getRegistrosAnterioresNaoCadastrados() {
        return registrosAnterioresNaoCadastrados;
    }

    public void setRegistrosAnterioresNaoCadastrados(List<RegistroAnterior> registrosAnterioresNaoCadastrados) {
        this.registrosAnterioresNaoCadastrados = registrosAnterioresNaoCadastrados;
    }

    public Registro getRegistroVisualizar() {
        return registroVisualizar;
    }

    public void setRegistroVisualizar(Registro registroVisualizar) {
        this.registroVisualizar = registroVisualizar;
    }
}
